package dao

import (
	"chat/app/model"
	"chat/utils"
	"gorm.io/gorm"
)

// 文档：https://gorm.io/zh_CN/docs/query.html

// ContactCreateBatch 批量插入
func ContactCreateBatch(contact *[]model.Contact) (err error) {
	db := utils.GetDB()
	err = db.Model(&contact).Create(&contact).Error
	return
}

func ContactGetOne(where string, args ...any) (contact *model.Contact, rowsAffected bool) {
	db := utils.GetDB()
	result := db.Model(&contact).
		Select("id").
		Where(where, args...).
		Limit(1).
		Find(&contact)
	rowsAffected = false
	if rows := result.RowsAffected; rows > 0 {
		rowsAffected = true
	}
	return
}

// ContactTransactionAuto 匿名事务
// 可使用db.Transaction匿名方法来表明多个操作在一个事务里面，返回err将回滚，返回nil将提交事务
func ContactTransactionAuto() error {
	db := utils.GetDB()
	err := db.Transaction(func(tx *gorm.DB) error {
		// 在事务中执行一些 db 操作（从这里开始，您应该使用 'tx' 而不是 'db'）
		if err := tx.Create(&model.Contact{OwnerId: 1}).Error; err != nil {
			// 返回任何错误都会回滚事务
			return err
		}
		if err := tx.Delete(&model.Contact{}, 28).Error; err != nil {
			return err
		}
		// 返回 nil 提交事务
		return nil
	})
	if err != nil {
		return err
	}
	return nil
}

// ContactTransaction 手动事务
func ContactTransaction(addContact1, addContact2 *model.Contact) error {
	db := utils.GetDB()
	tx := db.Begin()
	defer func() {
		if r := recover(); r != nil {
			tx.Rollback()
		}
	}()
	// 在事务中执行一些 db 操作（从这里开始，您应该使用 'tx' 而不是 'db'）
	if err := tx.Create(&addContact1).Error; err != nil {
		// 回滚事务
		tx.Rollback()
		return err
	}
	if err := tx.Create(&addContact2).Error; err != nil {
		tx.Rollback()
		return err
	}
	// 提交事务
	return tx.Commit().Error
}

// SearchContactIds 每个人所有的群组
func SearchContactIds(userId int64) (contact *[]model.Contact, rowsAffected bool) {
	db := utils.GetDB()
	result := db.
		Select("id", "receive_id").
		Where("owner_id = ? and cate = ?", userId, model.ConcatCateCommunity).
		Order("id desc").
		Find(&contact)
	rowsAffected = false
	if rows := result.RowsAffected; rows > 0 {
		rowsAffected = true
	}
	return
}

// SearchContactUids 群组下所有的人uid
func SearchContactUids(groupId int64) (contact *[]model.Contact, rowsAffected bool) {
	db := utils.GetDB()
	result := db.
		Select("id", "owner_id").
		Where("receive_id = ? and cate = ?", groupId, model.ConcatCateCommunity).
		Order("id desc").
		Find(&contact)
	rowsAffected = false
	if rows := result.RowsAffected; rows > 0 {
		rowsAffected = true
	}
	return
}

// SearchFriendUids 所有好友uid
func SearchFriendUids(userId int64) (contact *[]model.Contact, rowsAffected bool) {
	db := utils.GetDB()
	result := db.
		Select("id", "receive_id").
		Where("owner_id = ? and cate = ?", userId, model.ConcatCateUser).
		Order("id desc").
		Find(&contact)
	rowsAffected = false
	if rows := result.RowsAffected; rows > 0 {
		rowsAffected = true
	}
	return
}
